package com.wjw.rabbitmq.springbootorderrabbitmqconsumer.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Direct模式：路由Key模式
 * RabbitMQ配置文件类,创建交换机、创建队列、绑定交换机和队列的关系。
 * 可以在生产者和消费者两边同时配置。
 */
@Configuration
public class DirectRabbitMQConfiguration {

    //1.声明direct模式的交换机
    @Bean
    public DirectExchange directExchange(){
        /**
         * 参数1：交换机名称：来源于OrderService中的名称,要保持一致
         * 参数2：是否持久化
         * 参数3：是否自动删除
         */
        return new DirectExchange("direct_order_exchange",true,false);
    }

    //2.声明队列：sms.direct.queue、email.direct.queue、duanxin.direct.queue
    @Bean
    public Queue smsQueueDirect(){
        /**
         * 参数1：队列名称
         * 参数2：是否持久化
         */
        return new Queue("sms.direct.queue",true);
    }

    @Bean
    public Queue emailQueueDirect(){
        /**
         * 参数1：队列名称
         * 参数2：是否持久化
         */
        return new Queue("email.direct.queue",true);
    }

    @Bean
    public Queue duanxinQueueDirect(){
        /**
         * 参数1：队列名称
         * 参数2：是否持久化
         */
        return new Queue("duanxin.direct.queue",true);
    }

    //3.完成队列和交换机之间的绑定关系,有路由key
    @Bean
    public Binding smsBindingDirect(){
        return BindingBuilder.bind(smsQueueDirect()).to(directExchange()).with("sms");
    }

    @Bean
    public Binding emailBindingDirect(){
        return BindingBuilder.bind(emailQueueDirect()).to(directExchange()).with("email");
    }

    @Bean
    public Binding duanxinBindingDirect(){
        return BindingBuilder.bind(duanxinQueueDirect()).to(directExchange()).with("duanxin");
    }
}

